package com.cotasul.tela;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.cotasul.bean.ProdutoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.negocio.ProdutoServico;
import com.cotasul.negocio.interfaces.IServicoGenerico;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;

@ManagedBean
@SessionScoped
public class ListaProdutoTela extends TelaAbstrata {

	private ProdutoServico<ProdutoBean> produtoServico;

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private List<ProdutoBean> listaProdutos;

	private StreamedContent imagemProduto;

	private String codProdFiltro;

	private String descProdFiltro;

	public ListaProdutoTela() {
		produtoServico = new ProdutoServico<ProdutoBean>();

		listaProdutos = new ArrayList<ProdutoBean>();
	}

	public void filtrarProdutos() {
		try {
			listaProdutos = this.produtoServico.consultaProdutos(codProdFiltro,
					descProdFiltro, usuario.getCodigo());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void excluir(ProdutoBean produto) {
		FacesMessage msg = null;
		try {
			this.produtoServico.excluir(produto);
			filtrarProdutos();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_registro_delecao"));
		} catch (MySQLIntegrityConstraintViolationException e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor(
							"msg_erro_constraint_violation_em_uso"));
		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_excluir"));
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void preparaImagem(byte[] imagem) {
		try {
			BufferedImage img = ImageIO.read(new ByteArrayInputStream(imagem));
			File file = new File("imagem");
			ImageIO.write(img, "png", file);
			FileInputStream fi = new FileInputStream(file);
			imagemProduto = new DefaultStreamedContent(fi);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void alterar(ProdutoBean produto){
		FacesMessage msg = null;
		try{
			produtoServico.alterar(produto);
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_registro_alteracao"));
		}catch(Exception e){
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_alterar"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.produtoServico;
	}

	public ProdutoServico<ProdutoBean> getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico<ProdutoBean> produtoServico) {
		this.produtoServico = produtoServico;
	}

	public List<ProdutoBean> getListaProdutos() {
		return listaProdutos;
	}

	public void setListaProdutos(List<ProdutoBean> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public StreamedContent getImagemProduto() {
		return imagemProduto;
	}

	public void setImagemProduto(StreamedContent imagemProduto) {
		this.imagemProduto = imagemProduto;
	}

	public String getCodProdFiltro() {
		return codProdFiltro;
	}

	public void setCodProdFiltro(String codProdFiltro) {
		this.codProdFiltro = codProdFiltro;
	}

	public String getDescProdFiltro() {
		return descProdFiltro;
	}

	public void setDescProdFiltro(String descProdFiltro) {
		this.descProdFiltro = descProdFiltro;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

}
